package net.zjitc.test;

/**
 * 回文素数是一个既是素数又是回文数的整数。回文素数与记数系统的进位制有关。
 * 	回文素数是指，对一个整数n（n≥11）从左向右和从右向左读其结果值相同且是素数，即称n为回文素数。
 * 	例如：最初几个回文素数：11，101，131，151，181，191，313……
 * 	分析：
 * 	首先该数必须是素数，然后若是2位数，则个位与十位数字要相等，若是3位数，则个位与百位数字要相等
 *
 * 	调试debug:
 * 	 1) 断点：  main方法中，加断点； 调用的其他方法也加断点
 * 	 2） 以debug形式启动程序
 * 	 3） 按F8单步执行
 * 	 4） 若要看中间变量  watch 加观察量
 */
public class HuiWenPrime {
    public static void main(String[] args) {
        /* 找11到999之内的回文素数（循环）
                先判断该数是否是素数
                   若不是，则结束本次循环，判断下一个数
                   若是，则继续判断： 若是2位数，判断个位与十位是否相等
                                     若是3位数，判断个位与百位是否相等
        *  */
        /* 首先判断11是不是素数，是素数，则再判断11是不是回文数（...）
        *  接着判断12是不是素数，不是素数，结束
        *  然后判断13....*/
        for (int i = 11; i <=999 ; i++) {
            // 若有一个方法/函数 来判断是否是素数,若是素数返回TRUE，若不是返回FALSE
            if(!prime(i)){
                // 不是素数,结束本次循环，继续下一次循环
                continue;
            }
            // 若有一个方法/函数，来判断是否是回文数,若是回文数返回TRUE，若不是返回FALSE
            // alt+enter 自动提示
            if(huiWen(i)){
                // 显示在一行，用制表符分隔
                System.out.print(i+"\t");
            }
        }
    }

    /**
     * 判断一个数i是不是回文数，若是返回TRUE，否则返回FALSE
     * @param i
     * @return
     */
    private static boolean huiWen(int i) {
        /* 若是2位数，判断个位与十位是否相等
           若是3位数，判断个位与百位是否相等*/
        /* 目前该数i 是从11到999，不是2位数就是3位数，简单处理。*/
        // 若2位数，a表示是十位数，若3位数，a表示百位数
        int a;
        if(i<=99){
            // 2位数
            a=i/10;
        }else{
            // 3位数
            a=i/100;
        }
        return  a==i%10;
    }

    /**
     *  判断一个数i 是不是素数，若是素数返回TRUE，否则返回FALSE
     * @param i
     * @return
     */
    private static boolean prime(int i) {
        /* 素数：出了1和本身之外，不能被其他整除的数*/
        for (int j = 2; j <i/2 ; j++) {
            if(i%j==0){
                return false;
            }
        }
        return true;
    }

}
